﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace CommandMail
{
    class Program
    {
        static void Main(string[] args)
        {
            // controlo que se pasen los paramtros
            if (args.Count() == 0)
            {
                HelpMessage();
                return;
            }

            // valido los parametros
            if (!ValidateArgs(args))
            {
                HelpMessage();
                return;
            }


            // parseo los parametros
            ClientParameters parameters = ParseArgs(args);
            Client client = new Client(parameters);

            ClientSendResponse response = client.Send();

            Console.WriteLine(response.Status.ToString());
            Console.WriteLine(response.Message);

            //Console.ReadKey();
        }

        /// <summary>
        /// Valida los argumentos pasados por parametros
        /// Todos los argumentos deben ser de la forma /OPCION:VALOR o /OPCION:"VALOR"
        /// </summary>
        /// <param name="args">Argumentos</param>
        private static bool ValidateArgs(string[] args)
        {
            bool isValid = true;

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i].Contains("ssl") && !args[i].StartsWith("/"))
                {
                    isValid = false;
                    break;
                }

                // valido el formato
                if (!args[i].Contains("ssl") && (!args[i].StartsWith("/") || !args[i].Contains(":") || args[i].Contains("/\"") || args[i].Contains("\":")))
                {
                    isValid = false;
                    break;
                }

                // valido los mails
                if (args[i].Contains("from") || args[i].Contains("to"))
                {
                    string[] temp = args[i].Split(':');
                    isValid = MailHelper.ValidateMailAddress(temp[1]);

                    if (!isValid)
                        break;
                }
            }

            return isValid;
        }

        private static void HelpMessage()
        {
            Console.Clear();

            Console.WriteLine(new String('*', Console.WindowWidth));
            Console.WriteLine("CommandMail :: Cliente SMTP para el envio de mails desde la linea de comandos");
            Console.WriteLine(new String('*', Console.WindowWidth));
            Console.WriteLine("");
            Console.WriteLine("Opciones:");
            Console.WriteLine(" /from ó /f         : ");
            Console.WriteLine(" /to ó /t           : ");
            Console.WriteLine(" /subject ó /s      : ");
            Console.WriteLine(" /message ó /m      : Texto del mensaje.");
            Console.WriteLine(" /messagetype ó /mt : ");
            Console.WriteLine(" /smtpserver ó /ss  : Servidor SMTP.");
            Console.WriteLine(" /smtpuser ó /su    : Usuaro para conectarse al servidor SMTP.");
            Console.WriteLine(" /smtppassword ó /sp: Clave del usuario de conexión.");
            //Console.WriteLine("   /configfile ó /cf  : Archivo de configuracion. En el caso de utilizar este parametro, la aplicacion omitira el resto de los parámetros.");
            Console.WriteLine(" /messagefile ó /mf : Archivo de texto plano o html con el cuerpo del mensaje.");
            Console.WriteLine("                      En el caso de utilizar este parámetro, aplicacion omitirá");
            Console.WriteLine("                      el parámetro /message");
            Console.WriteLine(" /smtpport ó /p     : Puerto a utilizar para conectarse con el servidor SMTP");
            Console.WriteLine(" /ssl               : Puerto de conexión segura");

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        private static ClientParameters ParseArgs(string[] args)
        {
            ClientParameters parameters = new ClientParameters();

            for (int i = 0; i < args.Length; i++)
            {
                string[] temp = args[i].Split(':');

                string key = temp[0].Replace("/", "");
                string value = "";

                if (key.ToLower() != "ssl")
                {
                    value = temp[1].Replace("\"", "");
                }

                parameters.Add(key, value);
            }

            return parameters;
        }
    }
}
